
package redeS.mensagem.requisicao;

import redeS.mensagem.GnutellaMessage;

/**
 * Superclasse que representa uma requisição (de um recurso, um serviço, etc.) feita por
 * um nó na rede Gnutella. Essa requisição está relacionada com a mensagem de requisição
 * que um nó emite (por exemplo: um Ping - requisição de informação dos outros nós;
 * um Query - requisição de um recurso, entre outros)
 * @author thiago-pc
 */
public abstract class Request {
	
	/**
	 * O ID da requisão - que é o mesmo ID da mensagem.
	 */
	protected long ID;
	
	/**
	 * Time to live da reqisição: o dobro do TTL da mensagem (tempo máximo de ida e volta).
	 */
	protected int TTL;
	protected int hops;
	
	/**
	 * Número de respostas que essa requisição obteve.
	 */
	protected int numberOfAnswers;
	
	protected Request(GnutellaMessage message){
		ID = message.getDescriptorID();
		TTL = message.getTTL() * 2;
		hops = 0;
		numberOfAnswers = 0;
	}

	/**
	 * Decrementa o TTL uma vez até zero (o mesmo que TTL = TTL - 1).
	 */
	public void TTLDecrement(){
		if(TTL > 0){
			TTL--;
			hops++;
		}
	}
	
	/**
	 * Time to live da reqisição: o dobro do TTL da mensagem (tempo máximo de ida e volta).
	 */
	public int getTTL(){
		return TTL;
	}
	
	/**
	 * Hops da requisição.
	 */
	public int getHops(){
		return hops;
	}
	
	/**
	 * Número de respostas que essa requisição obteve.
	 */
	public int getNumberOfAnswers(){
		return numberOfAnswers;
	}
	
	/**
	 * Verifica se a mensagem corresponde (é uma resposta) a essa requisição.</br>
	 * <b>Atenção!</b> Esse método não apenas retorna essa resposta como também realiza
	 * algum processamento específico, em caso afirmativo. Consulte o comentário desse
	 * método sobrecarregado da subclasse para saber o que faz.
	 */
	public abstract boolean isAnswer(GnutellaMessage message);
}
